타겟 인코딩

AI
qwen-3-235b-a22b-instruct-2507
작성자
익명
작성일
2025.08.31
조회수
18
버전
v2

📋 문서 버전

이 문서는 2개의 버전이 있습니다. 현재 최신 버전을 보고 있습니다.

타겟 인코딩

개요

타겟 인코딩(Target)은 머신러닝과 과학 분야에서 범주형 변수(C Variable)를 수형 변수로 변환하는 고급 인딩 기법 중입니다. 이 방법은주형 변수의 범주(Category)를 해당 범에 속하는 타 변수(Target Variable)의계적 요약(예: 평균, 중값, 분산)으로 대체하는식입니다. 특히귀 또는 분류에서 범주형 피를 모델에 효과적으로 통합할 필요가 있을 때용하게 사용됩니다.

타겟 인코딩은 단순한 원-핫 인코딩(One-Hot Encoding)이나 레이블 인코딩(Label Encoding)보다 더 많은 정보를 포함할 수 있기 때문에, 모델의 성능을 향상시키는 데 기여할 수 있습니다. 하지만 잘못 사용하면 데이터 누수(Data Leakage) 및 과적합(Overfitting) 문제가 발생할 수 있으므로 주의가 필요합니다.


타겟 인코딩의 원리

타겟 인코딩은 각 범주형 값에 대해 타겟 변수의 기대값을 계산하여 그 값을 피처 값으로 사용하는 방식입니다. 예를 들어, 이진 분류 문제에서 타겟이 0 또는 1일 경우, 범주 A에 속하는 샘플들의 타겟 평균(즉, 1의 비율)을 범주 A의 인코딩 값으로 할당합니다.

기본 예시

다음과 같은 데이터가 있다고 가정합시다:

지역 타겟
서울 1
부산 0
서울 1
대구 1
부산 1
서울 0
  • 서울: 타겟 평균 = (1 + 1 + 0) / 3 = 0.666
  • 부산: 타겟 평균 = (0 + 1) / 2 = 0.5
  • 대구: 타겟 평균 = 1 / 1 = 1.0

이제 '지역' 피처를 다음과 같이 인코딩할 수 있습니다:

지역 인코딩 값
서울 0.666
부산 0.5
대구 1.0

이 값들은 모델의 입력으로 사용될 수 있습니다.


타겟 인코딩의 장점

  1. 고차원 문제 해결: 범주 수가 매우 많은 경우(예: 도시명, 제품 ID 등), 원-핫 인코딩은 차원이 급격히 증가하여 "차원의 저주" 문제가 발생할 수 있습니다. 타겟 인코딩은 단일 수치값으로 변환하므로 차원 증가를 방지합니다.

  2. 의미 있는 수치화: 각 범주가 타겟과의 관계를 반영하는 수치로 변환되므로, 모델이 범주 간의 중요도나 경향성을 더 쉽게 학습할 수 있습니다.

  3. 비선형 관계 포착: 범주와 타겟 간의 관계가 단순하지 않을 때, 타겟 인코딩은 이 관계를 효과적으로 요약할 수 있습니다.


주의사항 및 문제점

1. 데이터 누수 (Data Leakage)

타겟 인코딩을 전체 데이터셋에 대해 수행하면, 검증 데이터나 테스트 데이터의 정보가 훈련 단계에서 유출될 수 있습니다. 이는 모델의 일반화 성능을 과대평가하게 만듭니다.

해결 방법: - 교차 검증 기반 인코딩(Cross-validation based encoding): 훈련 데이터를 폴드로 나누고, 각 폴드에서 타겟 인코딩을 수행할 때 다른 폴드의 정보만 사용. - 리드-인(Leave-one-out): 특정 샘플을 제외한 나머지 데이터로 인코딩 값을 계산하여 그 샘플에 적용.

2. 소수의 샘플을 가진 범주에 대한 과적합

범주 내 샘플 수가 적을 경우, 인코딩 값이 노이즈에 민감해져 과적합될 수 있습니다.

해결 방법: - 스무딩(Smoothing): 전체 타겟 평균과 범주별 평균을 가중 평균하여 안정성을 높임.

예:
$$ \text{Encoded Value} = \frac{(\text{count} \times \text{category\_mean}) + (\text{prior} \times \text{global\_mean})}{\text{count} + \text{prior}} $$

여기서 prior는 정규화 강도를 조절하는 하이퍼파라미터입니다.


구현 예시 (Python)

import pandas as pd
from sklearn.model_selection import KFold
import numpy as np

def target_encode(train_df, test_df, cat_cols, target_col, alpha=5.0):
    """
    타겟 인코딩 함수 (스무딩 및 CV 기반)
    """
    train_encoded = train_df.copy()
    test_encoded = test_df.copy()
    global_mean = train_df[target_col].mean()
    
    kf = KFold(n_splits=5, shuffle=True, random_state=42)
    for col in cat_cols:
        # 테스트 데이터: 전체 훈련 데이터 기반 인코딩
        temp_df = train_df.groupby(col)[target_col].agg(['mean', 'count'])
        temp_df['smoothed'] = (temp_df['mean'] * temp_df['count'] + global_mean * alpha) / (temp_df['count'] + alpha)
        test_encoded[col + '_target'] = test_encoded[col].map(temp_df['smoothed'])
        test_encoded[col + '_target'].fillna(global_mean, inplace=True)
        
        # 훈련 데이터: CV 기반 리드-인 스타일 인코딩
        train_encoded[col + '_target'] = 0.0
        for train_idx, val_idx in kf.split(train_df):
            tr, val = train_df.iloc[train_idx], train_df.iloc[val_idx]
            temp_map = tr.groupby(col)[target_col].agg(['mean', 'count'])
            temp_map['smoothed'] = (temp_map['mean'] * temp_map['count'] + global_mean * alpha) / (temp_map['count'] + alpha)
            val_encoded = val[col].map(temp_map['smoothed'])
            val_encoded.fillna(global_mean, inplace=True)
            train_encoded.loc[val_idx, col + '_target'] = val_encoded
    
    return train_encoded, test_encoded


관련 기법

  • 원-핫 인코딩(One-Hot Encoding): 범주를 이진 벡터로 변환. 고차원 문제 발생 가능.
  • 레이블 인코딩(Label Encoding): 범주에 정수값 할당. 순서 정보를 잘못 유도할 수 있음.
  • 카운트 인코딩(Count Encoding): 각 범주의 출현 빈도를 사용.
  • 하이브리드 인코딩: 타겟 인코딩과 다른 기법을 조합.

참고 자료 및 관련 문서

타겟 인코딩은 고차원 범주형 데이터를 다룰 때 강력한 도구이지만, 신중한 구현과 검증이 필수적입니다.

AI 생성 콘텐츠 안내

이 문서는 AI 모델(qwen-3-235b-a22b-instruct-2507)에 의해 생성된 콘텐츠입니다.

주의사항: AI가 생성한 내용은 부정확하거나 편향된 정보를 포함할 수 있습니다. 중요한 결정을 내리기 전에 반드시 신뢰할 수 있는 출처를 통해 정보를 확인하시기 바랍니다.

이 AI 생성 콘텐츠가 도움이 되었나요?